/**
 * @typedef {Object} channel
 * @property {String} currentChannel 当前频道
 * @property {Function} exposeProp 暴露 相关 属性或者函数 需要 装载到对象中 会 直接 更改相关 变量信息
 * @property {Function} inject 注入 待运行函数
 * @property {Function} injected 运行 待运行函数  可以 传递 相关参数 == call 函数
 * @property {Function} getstatus 获取 运行状态 可以直接重新赋值 该函数 获取 所需要的运行状态
 * @property {Function} getProps 获取 频道 内的 暴露属性
 * @property {Array} exposedProp 频道内 所暴露的 属性 数组 每次调用 会 push 到其中 [{a,b},{c}]
 * @property {Function} injectfunca 当前频道 注入的 带运行函数
 */
/**
 * 初始化 创建 注入函数的 数据功能
 * @returns {channel} {
 *  currentChannel,
 *  exposeProp,
 *  inject,
 *  injected: runInjectedFunc,
 *  getstatus,
 *  exposedProp,
 *  injectfunca
 * }
 */
function initInject(channel) {
  let that = {
    currentChannel: channel,
    exposeProp,
    inject: injectFunc,
    injected: runInjectedFunc,
    getstatus,
    getProps,
    exposedProp: [],
    injectfunca: undefined,
  };
  return that;
}

/**
 * 暴露 函数
 * @returns 接收到的 第一个参数
 */
function exposeProp() {
  //   console.log(this);
  this['exposedProp'].push(arguments[0]);
  //   console.log('暴露 值 : ' + this['exposedProp']);
  // return arguments[0];
}
/**
 * 注入函数 在此 进行一系列 逻辑操作
 */
function injectFunc(func) {
  //   console.log('注入的函数 : ' + func);
  // checkPropError;
  // rebackPropValue;
  // checkFuncError;
  this['injectfunca'] = func;
}

//   运行 注入函数
function runInjectedFunc() {
  //   console.log('运行 注入函数' + this['injectfunca']);
  this['injectfunca'](...arguments);
}
/**
 * 获取状态 当前是否 注入了 函数
 * @returns {Boolean}
 */
function getstatus() {
  //   console.log(
  //     '当前频道' + this['currentChannel'] + ' 注入的函数' + this['injectfunca']
  //   );
  return this['injectfunca'] == undefined ? false : true;
}

/**
 *
 * @returns 从 静态资源 获取的一些 注入函数 总的信息
 */
function getStaticInjectData() {
  return { data: [] };
}

/**
 * 获取 暴露 过的 属性
 * @param {String} str 暴露 过的 属性 名称
 */
function getProps(str) {
  for (let i = 0; i < this['exposedProp'].length; i++) {
    if (this['exposedProp'][i][str] != undefined) {
      return this['exposedProp'][i][str];
    }
  }
  return false;
}

export { initInject, getStaticInjectData };
